package com.woniuxy.controller;

import com.woniuxy.entity.Order;
import com.woniuxy.entity.DTO.OrderQueryDTO;
import com.woniuxy.service.IOrderService;
import com.woniuxy.util.PageResult;
import com.woniuxy.util.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author pml
 * @Date 2025/7/16 17:41
 * @Description TODO
 * 订单管理控制器
 * 处理订单相关的所有HTTP请求
 * 遵循RESTful API设计规范，与UserController保持一致的接口风格
 */
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private IOrderService orderService;

    /**
     * 分页多条件查询订单列表
     * 使用GET请求，参数通过查询字符串传递
     * 与用户管理模块的分页查询接口保持一致的设计
     */
    @GetMapping("/list")
    public ResponseData<PageResult<Order>> getOrderList(OrderQueryDTO queryDTO) {
        PageResult<Order> pageResult = orderService.getOrderList(queryDTO);
        return ResponseData.ok(pageResult);
    }

    /**
     * 根据ID查询单个订单
     * 路径参数方式传递订单ID
     * 用于订单详情查看功能
     */
    @GetMapping("/{orderId}")
    public ResponseData<Order> getOrderById(@PathVariable String orderId) {
        Order order = orderService.getById(orderId);
        return ResponseData.ok(order);
    }

    /**
     * 新增订单
     * 使用POST请求，JSON格式传递订单信息
     * 用于创建新订单场景
     */
    @PostMapping
    public ResponseData addOrder(@RequestBody Order order) {
        // 订单创建时默认设置为待支付状态
        // 状态码定义与Order实体类中的注释保持一致
        order.setStatus(1);
        boolean success = orderService.save(order);
        return success ? ResponseData.ok() : ResponseData.fail(500, "新增订单失败");
    }

    /**
     * 更新订单信息
     * 使用PUT请求，JSON格式传递更新信息
     * 主要用于订单状态更新（支付、取消、完成等操作）
     */
    @PutMapping
    public ResponseData updateOrder(@RequestBody Order order) {
        boolean success = orderService.updateById(order);
        return success ? ResponseData.ok() : ResponseData.fail(500, "更新订单失败");
    }

    /**
     * 根据ID删除单个订单
     * 使用DELETE请求，路径参数传递订单ID
     * 实际业务中订单通常不物理删除，这里保留接口以便后续改为逻辑删除
     */
    @DeleteMapping("/{orderId}")
    public ResponseData deleteOrder(@PathVariable String orderId) {
        boolean success = orderService.removeById(orderId);
        return success ? ResponseData.ok() : ResponseData.fail(500, "删除订单失败");
    }

    /**
     * 批量删除订单
     * 使用DELETE请求，请求体传递订单ID列表
     * 适应批量操作场景，提高管理效率
     */
    @DeleteMapping("/batch")
    public ResponseData batchDeleteOrder(@RequestBody List<String> orderIds) {
        boolean success = orderService.removeByIds(orderIds);
        return success ? ResponseData.ok() : ResponseData.fail(500, "批量删除失败");
    }
}